// 创建对象的深度克隆。克隆基础类型、数组和对象，不包括类实例。

// 使用递归。
// 检查传递的对象是否是null，如果是，则返回null。
// 使用Object.assign()和 空对象 ( {}) 创建原始对象的浅层克隆。
// 使用Object.keys()和Array.prototype.forEach()确定需要深度克隆的键值对。
// 如果对象是一个Array，设置clone的length与原始和使用Array.from(clone)，以创建一个克隆。

const deepClone = (obj) => {
  if (obj === null) return null;
  let clone = Object.assign({}, obj);
  Object.keys(clone).forEach(
    (key) =>
      (clone[key] =
        typeof obj[key] === "object" ? deepClone(obj[key]) : obj[key])
  );
  if (Array.isArray(obj)) {
    clone.length = obj.length;
    return Array.from(clone);
  }
  return clone;
};

// 例子
const a = { foo: "bar", obj: { a: 1, b: 2 } };
const b = deepClone(a); // a !== b, a.obj !== b.obj
